// #include <cstdio>
// #include <cstring>
// #include <iostream>
// #include <algorithm>

// using namespace std;

// const int N = 100010;

// int n;
// struct Edge
// {
//     int id, w;
// };
// vector<Edge> h[N];
// int dist[N];

// void dfs(int u, int father, int distance)
// {
//     dist[u] = distance;

//     for (auto node : h[u])
//         if (node.id != father)
//             dfs(node.id, u, distance + node.w);
// }

// int main()
// {
//     scanf("%d", &n);
//     for (int i = 0; i < n - 1; i ++ )
//     {
//         int a, b, c;
//         scanf("%d%d%d", &a, &b, &c);
//         h[a].push_back({b, c});
//         h[b].push_back({a, c});
//     }

//     dfs(1, -1, 0);

//     int u = 1;
//     for (int i = 1; i <= n; i ++ )
//         if (dist[i] > dist[u])
//             u = i;

//     dfs(u, -1, 0);

//     for (int i = 1; i <= n; i ++ )
//         if (dist[i] > dist[u])
//             u = i;

//     int s = dist[u];

//     printf("%lld\n", s * 10 + s * (s + 1ll) / 2);

//     return 0;
// }

// 从题目描述可知，这道题的状态是一个无向树
// 要求的是无向树任意两点间的距离的最大值
// 是n叉树
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int h[N], e[2 * N], idx, ne[2 * N], w[2 * N];
int n;
bool flag[N];
int ans = 0;
// 添加一条从a到b，权重为c的线段
void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}

LL get_ans()
{
    LL l = 11, r = 10 + ans;
    return (l + r) * ans / 2;
}

int dfs(int up, int root)
{
    flag[root] = true;
    int maxx = 0, maxx2 = 0;
    int max_len = 0;
    for(int i = h[root]; ~i; i = ne[i])
    {
        if(flag[e[i]]) continue; // 跳过父节点
        int pos = e[i], len = dfs(up + w[i], pos);
        if(w[i] + len > max_len)
            max_len = w[i] + len;
        if(w[i] + len > maxx)
            maxx2 = maxx, maxx = w[i] + len;
    }
    // cout << root << ": " << maxx << ' ' << maxx2 << endl;
    ans = max(ans, maxx + maxx2);
    ans = max(ans, maxx + up);
    // cout << root << ":" << max_len << endl;
    return max_len;
}

int main()
{
    memset(h, -1, sizeof h);
    scanf("%d", &n);
    for(int i = 0; i < n - 1; ++i)
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c), add(b, a, c);
    }
    dfs(0, 1);
    // cout << endl << endl;
    // for(int i = 1; i <= n; ++i)
    // {
    //     cout << i << ": ";
    //     for(int j = h[i]; ~j; j = ne[j])
    //         cout << e[j] << ' ';
    //     cout << endl;
    // }
    // cout << ans << endl;
    cout << get_ans() << endl;
    return 0;
}